#include<bits/stdc++.h>
using namespace std;
typedef struct{
	long long f[6][6];
}Tree;
Tree t[400011];
int n,m,q;
const long long inf = 0x3f3f3f3f3f3f3f3f;
void push_up(int p)
{
	for(int i = 0;i <= m;i++)
		for(int j = 0;j <= m;j++)
			t[p].f[i][j] = -inf;
	for(int i = 0;i <= m;i++)
		for(int k = 0;k <= m;k++)
			for(int j = 0;j <= m;j++)
				t[p].f[i][j] = max(t[p].f[i][j],t[p << 1].f[i][k] + t[p << 1 | 1].f[k][j]);
}
int a[100011][7],c[100011];
void Re(int p,int pl,int l,int r)
{
	if(l == r)
	{
		for(int i = 0;i <= m;i++)
			for(int j = 0;j <= m;j++)
				t[p].f[i][j] = -inf;
		for(int i = 1;i <= m;i++)
			t[p].f[i][i] = a[pl][i];
		t[p].f[0][0] = t[p].f[c[pl]][0] = t[p].f[0][c[pl]] = a[pl][c[pl]];
		return;
	}
	int mid = l + r >> 1;
	if(pl <= mid)
		Re(p << 1,pl,l,mid);
	else
		Re(p << 1 | 1,pl,mid + 1,r);
	push_up(p);
}
void Build(int p,int l,int r)
{
	if(l == r)
		return Re(p,l,l,r);
	int mid = l + r >> 1;
	Build(p << 1,l,mid),Build(p << 1 | 1,mid + 1,r);
	push_up(p);
}
long long f[2][7];
int nw,lst;
void ask(int p,int l,int r,int ll,int rr)
{
	if(l <= ll && rr <= r)
	{
		swap(nw,lst);
		for(int i = 0;i <= m;i++)
			f[nw][i] = -inf;
		for(int i = 0;i <= m;i++)
			for(int j = 0;j <= m;j++)
				f[nw][j] = max(f[nw][j],f[lst][i] + t[p].f[i][j]);
		return;
	}
	int mid = ll + rr >> 1;
	if(l <= mid)
		ask(p << 1,l,r,ll,mid);
	if(mid < r)
		ask(p << 1 | 1,l,r,mid + 1,rr);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	freopen("paint.in","r",stdin);
	freopen("paint.out","w",stdout);
	cin >> n >> m >> q;
	for(int i = 1;i <= n;i++)
		cin >> c[i];
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++)
			cin >> a[i][j];
	Build(1,1,n);
	long long lans = t[1].f[0][0];
	cout << lans << "\n";
	while(q--)
	{
		int opt;
		cin >> opt;
		if(opt == 1)
		{
			long long pl,x;
			cin >> pl >> x;
			pl ^= lans,x ^= lans;
			c[pl] = x;
			Re(1,pl,1,n);
		}else{
			long long l,r;
			cin >> l >> r;
			l ^= lans,r ^= lans;
			nw = 0,lst = 1;
			f[0][0] = 0;
			for(int i = 1;i <= m;i++)
				f[0][i] = -inf;
			ask(1,l,r,1,n);
			cout << (lans = f[nw][0]) << "\n";
		}
	}
	return 0;
}
